import random,logging

from django.shortcuts import render
from django_redis import get_redis_connection
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
#from libs.yuntongxun.sms import CCP

from verifications.constans import SMS_CODE_REDIS_EXPIRES, SEND_SMS_TEMPLATE_ID, SEND_SMS_CODE_INTERVAL
from celery_tasks.sms.tasks import send_sms_code

logging.getLogger('django')
'''
为什么要用APIView?因为发短信验证码不需要操作mysql数据库，
也不需要数据库而且只需要处理一种业务，所有不需要用视图集
'''
class SMSCodeView(APIView):
    '''发送短信验证码'''
    def get(self,request,mobile):

        #创建链接到redis的对象
        #需要后面生成的验证码存储到里面，用来校验
        #get_redis_connection是djgango_redis内置的方法
        redis=get_redis_connection('verify')

        #发送短信之前，判断是否60s内发送过短信
        sms_flag=redis.get('sms_flag_%s'%mobile)
        if sms_flag:
            #sms_flag为True则表示60s内发送过信息
            return Response({'message':'发送短信过于频繁'},status=status.HTTP_400_BAS_REQUEST)

        #生成短信验证码
        sms_code = '%06d' % random.randint(0, 999999)
        try:
           #发送短信的异步任务必须通过delay调用delay是有app.task提供的
            send_sms_code.delay(mobile,sms_code)
        except Exception as e:
            #发送短信失败，记录错误信息到日志
            logging.error('发送短信失败！%s:%s'%(mobile,sms_code))
            return Response({'message': '发送短信失败'}, status=status.HTTP_502_BAD_GATEWAY)

        #把数据存储到redis的原始操作
        # redis.setex('sms_%s' % mobile, sms_code, SMS_CODE_REDIS_EXPIRES)
        # redis.setex('sms_flag_%s' % mobile, SEND_SMS_CODE_INTERVAL, 1)

        #保存短信验证码
        pl=redis.pipeline()#创建管道对象，管道对象具有和redis链接对象一样的操作方法，区别在于不会立即提交
        pl.setex('sms_%s'%mobile,SMS_CODE_REDIS_EXPIRES,sms_code)
        pl.setex('sms_flag_%s'% mobile,SEND_SMS_CODE_INTERVAL,1)
        pl.execute()#统一提交redis操作，提高性能
        return Response({"message":"ok"})
